// 消息路由
const express = require('express');
const router = express.Router();
const Message = require('../models/Message');
const { Op } = require('sequelize');

/**
 * 获取用户消息列表
 * @route GET /api/messages/user/:userId
 * @description 获取用户的消息列表
 * @access Private
 */
router.get('/user/:userId', async (req, res) => {
  try {
    const { userId } = req.params;
    const { page = 1, size = 20, isRead = '' } = req.query;
    const offset = (page - 1) * size;
    
    const whereCondition = {
      userId,
      status: 1 // 只返回正常状态的消息
    };
    
    // 是否已读筛选
    if (isRead !== '') {
      whereCondition.isRead = isRead === 'true';
    }
    
    const { count, rows } = await Message.findAndCountAll({
      where: whereCondition,
      limit: parseInt(size),
      offset: parseInt(offset),
      order: [['createdAt', 'DESC']]
    });
    
    res.status(200).json({
      success: true,
      data: rows,
      total: count,
      page: parseInt(page),
      totalPages: Math.ceil(count / size)
    });
  } catch (error) {
    console.error('获取消息列表失败:', error);
    res.status(500).json({ message: '服务器错误', error: error.message });
  }
});

/**
 * 获取未读消息数量
 * @route GET /api/messages/unread/:userId
 * @description 获取用户的未读消息数量
 * @access Private
 */
router.get('/unread/:userId', async (req, res) => {
  try {
    const { userId } = req.params;
    
    // 查询未读消息数量
    const unreadCount = await Message.count({
      where: {
        userId,
        isRead: false,
        status: 1
      }
    });
    
    res.status(200).json({ success: true, count: unreadCount });
  } catch (error) {
    console.error('获取未读消息数量失败:', error);
    res.status(500).json({ message: '服务器错误', error: error.message });
  }
});

/**
 * 标记消息为已读
 * @route PUT /api/messages/:id/read
 * @description 标记单条消息为已读
 * @access Private
 */
router.put('/:id/read', async (req, res) => {
  try {
    const { id } = req.params;
    
    // 查询消息
    const message = await Message.findByPk(id);
    
    if (!message) {
      return res.status(404).json({ message: '消息不存在' });
    }
    
    // 标记为已读
    await message.update({ isRead: true });
    
    res.status(200).json({ success: true, message: '消息已标记为已读' });
  } catch (error) {
    console.error('标记消息为已读失败:', error);
    res.status(500).json({ message: '服务器错误', error: error.message });
  }
});

/**
 * 标记所有消息为已读
 * @route PUT /api/messages/user/:userId/read-all
 * @description 标记用户的所有消息为已读
 * @access Private
 */
router.put('/user/:userId/read-all', async (req, res) => {
  try {
    const { userId } = req.params;
    
    // 标记所有消息为已读
    await Message.update(
      { isRead: true },
      { where: { userId, isRead: false, status: 1 } }
    );
    
    res.status(200).json({ success: true, message: '所有消息已标记为已读' });
  } catch (error) {
    console.error('标记所有消息为已读失败:', error);
    res.status(500).json({ message: '服务器错误', error: error.message });
  }
});

/**
 * 发送留言
 * @route POST /api/messages/leave
 * @description 用户发送留言
 * @access Public
 */
router.post('/leave', async (req, res) => {
  try {
    const { userId, title, content, type = 'feedback' } = req.body;
    
    // 验证必填字段
    if (!title || !content) {
      return res.status(400).json({ message: '请填写标题和内容' });
    }
    
    // 创建留言
    const message = await Message.create({
      userId: userId || 0, // 匿名用户使用0
      title,
      content,
      type,
      isRead: false
    });
    
    res.status(201).json({ success: true, message: '留言发送成功', data: message });
  } catch (error) {
    console.error('发送留言失败:', error);
    res.status(500).json({ message: '服务器错误', error: error.message });
  }
});

/**
 * 删除消息
 * @route DELETE /api/messages/:id
 * @description 删除单条消息
 * @access Private
 */
router.delete('/:id', async (req, res) => {
  try {
    const { id } = req.params;
    
    // 查询消息
    const message = await Message.findByPk(id);
    
    if (!message) {
      return res.status(404).json({ message: '消息不存在' });
    }
    
    // 软删除消息
    await message.update({ status: 2 });
    
    res.status(200).json({ success: true, message: '消息已删除' });
  } catch (error) {
    console.error('删除消息失败:', error);
    res.status(500).json({ message: '服务器错误', error: error.message });
  }
});

module.exports = router;